import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Scanner;
import java.io.*;

public class Kontrolleri {

    private final String POLKU = "kek";
    private final int VIIKONPAIVIA = 5;
    private Kali kali = new Kali(VIIKONPAIVIA);
    private Scanner lukija = new Scanner(System.in);
    private Kalenteri tapahtumat;


    public Kontrolleri() {

        int paiva = haePaiva();
        tapahtumat = new Kalenteri(VIIKONPAIVIA,POLKU);
        String syote = "";

        do {
            kali.printMain(tapahtumat.getTapahtumat(false), paiva);

            syote = lukija.nextLine();

            if (syote.equals("1")) {
                lisaaTapahtuma();
            } else if (syote.equals("2")) {
                poistaTapahtuma();
            } else if (syote.equals("3")) {
                vieTiedostoon();
            }

        } while (!syote.toUpperCase().equals("Q"));

        if(!tapahtumat.kirjoitaTiedostoon())
            kali.printVieFail();
    }

    /**
     * Lisää uuden tapahtuman.
     */
    private void lisaaTapahtuma() {

        boolean kokonaisLuku = false;
        boolean oikeatRajat = false;
        int tapahtumanPaiva = -1;
        int tapahtumanAlkuAika = -1;
        int tapahtumanLoppuAika = -1;
        Tapahtuma uusi = new Tapahtuma(VIIKONPAIVIA);

        // nimi:

        kali.printLisaa();
        String tapahtumanNimi = lukija.nextLine();
        uusi.setNimi(tapahtumanNimi);


        // viikonpäivä
        do {
            kali.printLisaaPaiva();
            kokonaisLuku = lukija.hasNextInt();

            if (!kokonaisLuku) {
                lukija.next(); // kelataan virheellisen arvon ohi
            } else {
                tapahtumanPaiva = lukija.nextInt();
                oikeatRajat = tapahtumanPaiva <= VIIKONPAIVIA && tapahtumanPaiva > 0;
                uusi.setPaiva(tapahtumanPaiva);
            }

        } while (!kokonaisLuku || !oikeatRajat);


        // alkuaika:

        kokonaisLuku = false;
        oikeatRajat = false;

        do {

            kali.printLisaaAlkuaika();
            kokonaisLuku = lukija.hasNextInt();

            if (!kokonaisLuku) {
                lukija.next(); // kelataan virheellisen arvon ohi
            } else {
                tapahtumanAlkuAika = lukija.nextInt();
                oikeatRajat = uusi.setAlkuAika(tapahtumanAlkuAika);
            }

        } while (!kokonaisLuku || !oikeatRajat);

        // loppuaika:

        kokonaisLuku = false;
        oikeatRajat = false;
     
        do {

            kali.printLisaaLoppuaika();
            kokonaisLuku = lukija.hasNextInt();

            if (!kokonaisLuku) {
                lukija.next(); // kelataan virheellisen arvon ohi
            } else {
                tapahtumanLoppuAika = lukija.nextInt();
                oikeatRajat = uusi.setLoppuAika(tapahtumanLoppuAika);
            }

        } while (!kokonaisLuku || !oikeatRajat);

        // sijainti:

        kali.printLisaaSijainti();
        lukija.nextLine(); // skipataan tyhjä rivi
        String tapahtumanSijainti = lukija.nextLine();
        uusi.setSijainti(tapahtumanSijainti);

        tapahtumat.lisaaTapahtuma(uusi);

    }

    /**
     * Poistaa tapahtuman.
     */
    private void poistaTapahtuma() {

        kali.printPoista(tapahtumat.getTapahtumat(true));
        boolean kokonaisluku = false;
        boolean poistu = false;
        int poistettava = 0;

        do {
            kokonaisluku = lukija.hasNextInt();

            if (!kokonaisluku) {
                kali.printAnnaInt();
                lukija.next();
            } else {
                poistettava = lukija.nextInt();
                
                if (poistettava != 0) {
                    poistu = tapahtumat.poistaTapahtuma(poistettava - 1);

                    if (!poistu) {
                        kali.printPoistaFail(poistettava);
                    }
                } else {
                    poistu = true;
                }
            }

        } while (!kokonaisluku || !poistu);
    }

    /**
     * Vie tapahtumat tiedostoon.
     * @return onnistuiko vienti
     */
    private void vieTiedostoon() {

        String tiedosto = "";
        kali.printVie();
        tiedosto = lukija.next();

        try {
            OutputStreamWriter kirjoitin = new OutputStreamWriter(
                    new FileOutputStream(tiedosto), "UTF-8");

            kirjoitin.write(kali.getTiedosto(tapahtumat.getTapahtumat(false)));

            kirjoitin.close();

        } catch (Exception e) {
            kali.printVieFail();
        }
    }

    /**
     * Palauttaa nykyisen viikonpäivän lukuna
     * @return viikonpäivän numeron väliltä 1-7
     */
    private int haePaiva() {
        Calendar kalenteri = new GregorianCalendar();
        int paiva = kalenteri.get(Calendar.DAY_OF_WEEK);

        paiva -= 1;
        if (paiva == 0) {
            paiva = 7;
        }

        return paiva;
    }

    /**
     * Main metodi ohjelman kännistämiseen
     * @param args komentoriviparametrit
     */
    public static void main(String[] args){

        Kontrolleri kontrolleri = new Kontrolleri();

    }
}
